package main

import (
	"fmt"
)

func mainArray() {
	/*
			长度不能为空

		可以使用...自动推导数组的长度
			var arr [3]int=[3]int{1,2,3}
			var arr2 arr=[...]int{7,8,9}

	*/
	var arr1 [3]int = [3]int{7, 8, 9}
	var arr2 = [...]int{9, 10, 11}

	// 索引
	fmt.Println(arr1[0])
	fmt.Println(arr1[1])
	fmt.Println(arr1[2])
	fmt.Println(arr2[2])
	//fmt.Println(arr1[3])  // 超过索引范围会编译错误
	// 修改元素
	arr2[0] = 11
	arr2[2] = 9
	fmt.Println(arr2)

	// 遍历
	for i := 0; i < len(arr2); i++ {
		fmt.Printf("arr2[%v]=%v\n", i, arr2[i])
	}
	// 第二种遍历
	for index, value := range arr2 {
		fmt.Printf("arr2 index=%v, value=%v\n", index, value)
	}

	var t [3][4]int = [3][4]int{
		{1, 2, 3, 4},
		{2, 3, 4, 5},
		{3, 4, 5, 6},
	}
	fmt.Println(t)

	for i, v := range t {
		for i2, v2 := range v {
			fmt.Printf("a[%v][%v]=%v\t", i, i2, v2)
		}
		fmt.Println()
	}

	/*

			这里的slice是从arr中切片切出来的

		：两边是顾头不顾尾（前闭后开）

		左边不写默认是0

		右边不写默认是最后一个


	*/

	var arr = [5]int{4, 5, 6, 7, 8}
	var slice = arr[0:5] // 切片的两边也是顾头不顾尾
	fmt.Println(slice)
	//切片是对数组的引用 如果改变切片中的元素，对应的数组也会变化
	slice[0] = 1
	fmt.Println(arr)
	var s1 = slice[0:2]

	s1[0] = 78

	fmt.Println(arr)
	//切片是引用类型 默认为nil
	var s []int
	fmt.Println(s == nil) // true

	//创建一个长度为3 容量为5的空间 容量不写 默认等于长度 长度：len 容量：cap
	s = make([]int, 3, 5)
	fmt.Println(s)

	s2 := []int{1, 2, 3, 4}
	//追加
	s = append(s2, 5, 6, 7, 8)

	fmt.Println(s)

	var s4 = make([]int, 8)
	copy(s4, s)
	fmt.Println(s4)

	str := "hello 世界"
	fmt.Printf("[]byte(str)=%s\n", []byte(str))
	fmt.Printf("[]byte(str)=%v\n", []byte(str))
	// 汉字被分成了三个数字
	for i, v := range str {
		fmt.Printf("str[%d]=%c\n", i, v)
	}

}
